package com.c2b.algorithm.leetcode.base;

/**
 * <a href='https://leetcode.cn/problems/maximum-sum-with-exactly-k-elements/'>K 个元素的最大和(Maximum Sum With Exactly K Elements)</a>
 * <p>
 * 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操作 恰好 k 次，最大化你的得分：
 *     <ol>
 *         <li>从 nums 中选择一个元素 m 。</li>
 *         <li>将选中的元素 m 从数组中删除。</li>
 *         <li>将新元素 m + 1 添加到数组中。</li>
 *         <li>你的得分增加 m 。</li>
 *     </ol>
 *     请你返回执行以上操作恰好 k 次后的最大得分。
 * </p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *      输入：nums = [1,2,3,4,5], k = 3
 *      输出：18
 *      解释：我们需要从 nums 中恰好选择 3 个元素并最大化得分。
 *          第一次选择 5 。和为 5 ，nums = [1,2,3,4,6] 。
 *          第二次选择 6 。和为 6 ，nums = [1,2,3,4,7] 。
 *          第三次选择 7 。和为 5 + 6 + 7 = 18 ，nums = [1,2,3,4,8] 。
 *          所以我们返回 18 。
 *          18 是可以得到的最大答案。
 *
 * 示例 2：
 *      输入：nums = [5,5,5], k = 2
 *      输出：11
 *      解释：我们需要从 nums 中恰好选择 2 个元素并最大化得分。
 *          第一次选择 5 。和为 5 ，nums = [5,5,6] 。
 *          第二次选择 6 。和为 6 ，nums = [5,5,7] 。
 *          所以我们返回 11 。
 *          11 是可以得到的最大答案。
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>1 <= nums.length <= 100 </li>
 *     <li>1 <= nums[i] <= 100 </li>
 *     <li>1 <= k <= 100</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2023/11/16 10:51
 */
public class LC2656MaximumSumWithExactlyKElements_S {

    static class Solution {
        public int maximizeSum(int[] nums, int k) {
            // 从数组中找出最大
            int first = nums[0];
            for (int num : nums) {
                first = Math.max(first, num);
            }
            // 利用等差数列。
            int last = first + k - 1;
            return (first + last) * k / 2;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.maximizeSum(new int[]{1, 2, 3, 4, 5}, 3));
        System.out.println(solution.maximizeSum(new int[]{5, 5, 5}, 2));
        System.out.println(solution.maximizeSum(new int[]{5}, 1));
    }
}
